/**
 * @Project : algorithm-learning
 * @Author : Ruoyu Wang
 * @User : MyComputer
 * @DateTime : 2024/3/23 9:48
 */

//有一棵有几个节点的树，小美在s节点，要去t节点。
//但小美是经常迷路的孩子，她不知道该怎么走，因此她每次都会随机选择一条之前没有走过的边走，小美想知道她能到达t节点的概率是多少。
//有多次询问，每次询问需要求出小美能到达t节点的概率对10^9+7取模后的结
//如果最后答案为分数，则最简分式后的形式为a/b，其中a和b互质，
//那么输出整数x使得b*x≡α(mod10^9+7)且0<=x<=10^9+7。可以证明这样的整数x是唯一的。
//
//输入描述
//  第一行输入一个整数n(1≤n≤2*10^5)表示树节点个数。
//  接下来n-1行，每行输入两个整数u,v(1≤u,v≤n)表示树上的边。
//  接下来一行，输入一个整数q(1≤q≤2*10^5)表示询问次数。
//  接下来q行，每行输入两个整数s,t(1≤s,t≤n)表示询问。
//输出描述
//  输出q行，每行输出一个整数表示概率。
//
//示例1
//输入
//3
//1 2
//1 3
//2
//2 3
//1 3
//输出
//1
//500000004
//说明
//  第1个询问:小美有1的概率从节点2走到节点1，然后有1的概率从节点1走到节点3，因此有1的概率能到达节点3，
//  1对1000000007取模后的结果为1。
//  第2个询问:小美有1/2的概率从节点1走到节点2，有1/2的概率从节点1走到节点3，因此只有1/2的概率能到达节点3，
//  1/2对1000000007取模后的结果为500000004。

#include <iostream>
#include <vector>
#include <unordered_set>

using namespace std;

const long long MOD = 1000000007;

struct Node {
    int val;
    vector<Node *> neighbors;

    Node(int val) : val(val) {}
};

double dfs(Node *node, Node *target, unordered_set<Node *> &visited) {
    if (node == target) {
        return 1.0;
    }

    visited.insert(node);
    int count = 0;
    for (Node *neighbor: node->neighbors) {
        if (visited.find(neighbor) == visited.end()) {
            count++;
        }
    }

    double probability = 0.0;
    for (Node *neighbor: node->neighbors) {
        if (visited.find(neighbor) == visited.end()) {
            probability += 1.0 / count * dfs(neighbor, target, visited);
        }
    }

    return (probability == 1.0) ? 1.0 : probability * MOD;
}

int main() {
    int n;
    cin >> n;
    vector<Node *> nodes(n + 1);
    for (int i = 1; i <= n; i++) {
        nodes[i] = new Node(i);
    }

    for (int i = 0; i < n - 1; i++) {
        int u, v;
        cin >> u >> v;
        nodes[u]->neighbors.push_back(nodes[v]);
        nodes[v]->neighbors.push_back(nodes[u]);
    }

    int q;
    cin >> q;
    for (int i = 0; i < q; i++) {
        int s, t;
        cin >> s >> t;
        unordered_set<Node *> visited;
        double probability = dfs(nodes[s], nodes[t], visited);
        cout << (long long) (probability + 0.5) << endl;
    }

    // Free memory
    for (int i = 1; i <= n; i++) {
        delete nodes[i];
    }

    return 0;
}